#include<iostream>
using namespace std;
#include<unistd.h>
#include<pthread.h>
#include<string>


//定义全局的条件变量和锁
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;


int ticket = 10000;
void* get_ticket(void* args){
    string name = (const char*)args;
    while(true){
        //省略判断
        //加锁和条件变量
        //一次只有一个线程进入临界区，并且进来后进行解锁后，就不能马上再申请锁，而是要去排队
        pthread_mutex_lock(&lock);
        pthread_cond_wait(&cond,&lock);//第二个参数是锁
        cout<<"我是新线程：，名称"<<name<<"正在抢票："<<ticket<<endl;
        ticket--;
        pthread_mutex_unlock(&lock);
    }
    return nullptr;

}

//使用条件变量来控制线程执行
int main(){
    //2个新线程去排队抢票
    // pthread_t t1,t2;
    // pthread_create(&t1,nullptr,get_ticket,(void*)"thread 1");
    // pthread_create(&t2,nullptr,get_ticket,(void*)"thread 2");

    //试试多线程
    pthread_t tids[5];
    for(int i = 0;i < 5;i++){
        char* name = new char[128];
        snprintf(name,128,"thread:%d",i+1);
        pthread_create(&tids[i],nullptr,get_ticket,name);
    }

    //在主线程对排队的线程唤醒
    while(true){
        sleep(1);
        //pthread_cond_signal(&cond);//唤醒一个线程
        pthread_cond_broadcast(&cond);//一次唤醒一批线程
        cout<<"唤醒成功"<<endl;
    }

    for(auto e: tids){
        pthread_join(e,nullptr);
    }


    // pthread_join(t1,nullptr);
    // pthread_join(t2,nullptr);



    //

    return 0;
}